#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
//定义3个全局数组
int A[10000][10000]={0};//A[][]用于存放原始数据，
int B[10000][10000]={0};//B[][]用于存放前面3个数中的最小的一个和该位置对应A中的值的和
int C[10000][10000]={0};//存放最小能量线的路径
int D[10000]={0};//存放能量线的值
int M=10000,N=10000,M1=10000,N1=10000;//定义全局变量，M为横坐标，N为纵坐标，
int h1=0,h2=0,h3=0,t1=0,t2=0,a=1,b=1;//定义全局变量，a,b为目标图像的大小,h1,h2,h3,为标志,t1记录删除竖直能量线的次数，t2记录删除水平能量线的次数

struct TU//定义结构体
{
   int num;//存储数
   int h;//存储横坐标
   int z;//存储纵坐标
   struct TU *next;
};
typedef struct TU NODE;
NODE *head1=NULL,*head2=NULL;//分别存储竖直能量线和水平能量线的值

NODE *creat(int k)//创建长度为k的链表
{
    NODE *head=NULL,*tail=NULL,*p=NULL;
    int i=0;
    while(i<3*k)//链表创建结束的标志为i=3*k
    {
        p=(NODE*)malloc(sizeof(NODE));
        p->num=D[i];//将数组D中的数值赋给链表结点的数据域
        p->h=D[i+1];//横坐标
        p->z=D[i+2];//纵坐标
        if(head==NULL)
        {
            head=p;
        }
        else
        {
            tail->next=p;
        }
        tail=p;
        i=i+3;
    }
    return head;
}

void print1(int n,int m)//n为查找的第几条竖直能量线，m为每条能量线的长度
{
    NODE *p;
    p=head1;
    int i=0;
    while(i<(n-1)*m)//将p指向第n条能量线的第一个结点
    {
        p=p->next;
        i++;
    }
    i=0;
    while(i<m)//从p开始输出m个结点
    {
        printf("%d(%d,%d) ",p->num,p->h,p->z);//输出数值，坐标
        p=p->next;
        i++;
    }
    printf("\n");
};

void print2(int n,int m)//n为查找的第几条水平能量线，m为每条能量线的长度
{
    NODE *p;
    p=head2;
    int i=0;
    while(i<(n-1)*m)//将p指向第n条能量线的第一个结点
    {
        p=p->next;
        i++;
    }
    if(p==NULL) printf("输入错误\n");
    i=0;
    while(i<m)//从p开始输出m个结点
    {
        printf("%d(%d,%d) ",p->num,p->h,p->z);//输出数值，坐标
        p=p->next;
        i++;
    }
    printf("\n");
};

int minof3(int a,int b,int c)//比较3个数的大小，输出较小的一个
{
	if(a<=b && a<=c)
		return a;
	else if(b<=c)
		return b;
	else
		return c;
}

//找到相邻的三个数，从相邻三个数中取出最小的一个
int getMin1(int i,int j)//找竖直能量线
{
	int a1,a2,a3;
	if(j-1>=0)//如果左上角相邻的数存在，赋值给a1，否则赋值给a1一个很大的数，以免影响比较大小
		a1=B[i-1][j-1];
	else
		a1=INT_MAX;
	a2=B[i-1][j];//直接将正上方一个数赋值给a2
	if(j+1<N)
		a3=B[i-1][j+1];//如果右上角相邻的数存在，赋值给a1，否则赋值给a1一个很大的数，以免影响比较大小
	else
		a3=INT_MAX;
	int min;
	    min=minof3(a1,a2,a3);//输出相邻三个数中较小的一个
	if(min==a1)
		C[i][j]=-1;//记录-1，意味上一个数来自左上角
	else if(min==a2)
		C[i][j]=0;//记录0，意味上一个数来自正上方
	else
		C[i][j]=1;//记录1，意味上一个数来自右上方
	return min;
}

int getMin2(int i,int j)//找横直能量线
{
	int a1,a2,a3;
	if(i-1>=0)//如果左上角相邻的数存在，赋值给a1，否则赋值给a1一个很大的数，以免影响比较大小
		a1=B[i-1][j-1];
	else
		a1=INT_MAX;
	a2=B[i][j-1];//直接将正左方一个数赋值给a2
	if(i+1<M)
		a3=B[i+1][j-1];//如果左下角相邻的数存在，赋值给a1，否则赋值给a1一个很大的数，以免影响比较大小
	else
		a3=INT_MAX;
	int min;
	    min=minof3(a1,a2,a3);//输出相邻三个数中较小的一个
	if(min==a1)
		C[i][j]=-1;//记录-1，意味上一个数来自左上角
	else if(min==a2)
		C[i][j]=0;//记录0，意味上一个数来自正左方
	else
		C[i][j]=1;//记录1，意味上一个数来自右下角
	return min;
}

void fp1()//找竖直能量线
{
	for(int i=0;i<M;i++)
	{

		for(int j=0;j<N;j++)
		{
			B[i][j]=A[i][j];//将A中的值给B
		}

	}
	for(int i=1;i<M;i++)//B中的第一行数组不变，从第二行开始储存当前数据与上一个最小数的和
	{
		for(int j=0;j<N;j++)
		{
			B[i][j]=getMin1(i,j)+B[i][j];//B等于当前数据与上一个最小数的和，B中最后一行的数据为各条能量线的值之和，最小的值则为所求能量线的值之和
		}
	}
}

void fp2()//找横直能量线的
{
	for(int i=0;i<M;i++)
	{
		for(int j=0;j<N;j++)
		{
			B[i][j]=A[i][j];//将A中的值给B
		}
	}

	for(int j=1;j<N;j++)//B中的第一列数组不变，从第二列开始储存当前数据与上一个最小数的和
	{
		for(int i=0;i<M;i++)
		{
			B[i][j]+=getMin2(i,j);//B等于当前数据与上一个最小数的和，B中最后一列的数据为各条能量线的值之和，最小的值则为所求能量线的值之和
		}
	}
}

int getResult1()//竖直能量线最后一位数据坐标的查找
{
    int min,i,mini;
	min=INT_MAX;//min为最小值
	for(i=0;i<N;i++)//i为纵坐标
	{
		if(B[M-1][i]<min)
		{
			min=B[M-1][i];
			mini=i;
		}//在数组B中最后一行查找最小值，最小值则为最小能量线之和

	}
	printf("能量线值之和:%d\n",min);
	return mini;//最小值的纵坐标
}

int getResult2()//水平能量线最后一位数据坐标的查找
{
    int i,min,mini;
	min=INT_MAX;//min为每条能量线值之和
	for(i=0;i<M;i++)//i为横坐标
	{
		if(B[i][N-1]<min)
		{
			min=B[i][N-1];
			mini=i;
		}//在数组B中最右一行查找最小值，最小值则为最小能量线之和

	}
	printf("能量线值之和:%d\n",min);
	return mini;//最小值的横坐标
}

void printTrace1(int n,int m)//竖直能量线的标志化，n为最后一个能量线数据的纵坐标,m为竖直能量线的长度
{
    int j,i;
    m--;
	D[m-2]=A[M-1][n];//将能量线的值赋给数组D[M-1][n]
	D[m-1]=M-1;//将能量线的值的横坐标赋给数组D[m-1]
	D[m]=n;//将能量线的值的纵坐标赋给数组D[m]
	A[M-1][n]=A[M-1][n]+300;//能量线上的值全部加上300，作为标志
	j=n+C[M-1][n];//上一个能量线数据的位置
	for(i=M-2;i>=0;i--)//i为横坐标
	{
	    m=m-3;;
		D[m-2]=A[i][j];//将能量线的值赋给数组D
		D[m-1]=i;
		D[m]=j;
		A[i][j]=A[i][j]+300;//能量线上的值全部加上300，作为标志
		j=C[i][j]+j;//上一个能量线数据的位置
	}

}

void printTrace11(int n)//查找竖直能量线，n为最后一个数值的纵坐标
{
    int i,j;
    printf("各个能量线值的坐标\n");
	printf("%d(%d,%d) ",A[M-1][n],M-1,n);//输出各个能量线值的坐标
	A[M-1][n]=A[M-1][n]+300;//标志
	j=n+C[M-1][n];//c为能量线的路径
	for(i=M-2;i>=0;i--)
	{
		printf("%d(%d,%d) ",A[i][j],i,j);
		A[i][j]=A[i][j]+300;
		j=C[i][j]+j;
	}
	printf("\n");
}

void printTrace2(int n,int m)//水平能量线的标志化，n为最后一个能量线数据的横坐标，m为每条水平能量线的长度
{
    int i,j;
    m--;
    D[m-2]=A[n][N-1];//将能量线的值赋给数组D[M-1][n]
    D[m-1]=n;//将能量线的值的横坐标赋给数组D[m-1]
    D[m]=N-1;//将能量线的值的纵坐标赋给数组D[m]
    A[n][N-1]=A[n][N-1]+300;//能量线上的值全部加上300，作为标志
	i=n+C[n][N-1];//上一个能量线数据的位置
	for(j=N-2;j>=0;j--)//j为纵坐标
	{
	    m=m-3;
		D[m-2]=A[i][j];//将能量线的值赋给数组D
		D[m-1]=i;
		D[m]=j;
		A[i][j]=A[i][j]+300;//能量线上的值全部加上300，作为标志
		i=C[i][j]+i;//上一个能量线数据的位置
	}
	printf("\n");
}

void printTrace22(int n)//查找水平能量线，n为最后一个数值的横坐标
{
    int i,j;
    printf("各个能量线值的坐标\n");
	printf("%d(%d,%d) ",A[n][N-1],n,N-1);
	A[n][N-1]=A[n][N-1]+300;
	i=n+C[n][N-1];
	for(j=N-2;j>=0;j--)
	{
		printf("%d(%d,%d) ",A[i][j],i,j);
		A[i][j]=A[i][j]+300;
		i=C[i][j]+i;
	}
	printf("\n");
}

void move1()//向左移动数组
{
    int i,j;
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
               if(A[i][j]>255)//如果A[i][j]>255,则从此位置起数组向左移动一个位置
                {
                    while(j<N)//移动数据的个数
                    {
                    A[i][j]=A[i][j+1];
                    j++;
                    }
                    break;//移动完第一行的数据，结束本行查找，查找下一行的数据
                }
        }
    }
}

void move11()//向右移动数组
{
    int i,j,k;
    for(i=0;i<M;i++)
    {
        k=N;
        for(j=0;j<N;j++)
        {
               if(A[i][j]>255)//如果A[i][j]>255,则从此位置起数组向右移动一个位置
                {
                    A[i][j]=A[i][j]-300;
                    while(j<N)//移动数据的个数
                    {
                    A[i][k]=A[i][k-1];
                    k--;
                    j++;
                    }
                    break;//移动完第一行的数据，结束本行查找，查找下一行的数据
                }
        }
    }
}

void move2()//向上移动数组
{
    int i,j;
    for(j=0;j<N;j++)
    {
        for(i=0;i<M;i++)
        {

               if(A[i][j]>255)//如果A[i][j]>255,则从此位置起数组向上移动一个位置
                {
                    while(i<M)//移动数据的个数
                    {
                    A[i][j]=A[i+1][j];
                    i++;
                    }
                    break;//移动完第一列的数据，结束本列查找，查找下一列的数据
                }
        }
    }
}

void move22()//向下移动数组
{
    int i,j,k;
    for(j=0;j<N;j++)
    {
        k=M;
        for(i=0;i<M;i++)
        {

               if(A[i][j]>255)//如果A[i][j]大于255,则从此位置起数组向下移动一个位置
                {
                    A[i][j]=A[i][j]-300;
                    while(i<M)//移动数据的个数
                    {
                    A[k][j]=A[k-1][j];
                    k--;
                    i++;
                    }
                    break;//移动完第一列的数据，结束本列查找，查找下一列的数据
                }
        }
    }
}

void printA1(int n)//n为能量线的第几条
{
	for(int i=0;i<M;i++)
	{
	    printf("   第%d行:",i+1);
		for(int j=0;j<N;j++)
		{
		    if(A[i][j]>255)//如果A[i][j]大于255，则输出第几条的标志
			    printf("  |*Ver%d*|",n);
			else
                printf("%10d",A[i][j]);//输出数据
		}
		printf("\n");//换行
	}
}

void printA2()
{
    int i,j;
	for(i=0;i<M;i++)
	{
	    printf("   第%d行:",i+1);
		for(j=0;j<N;j++)
		{
		    if(A[i][j]>255)//如果A[i][j]大于255，则输出标志
			printf("   |*Ver*|");
			else printf("%10d",A[i][j]);//输出数据
		}
		printf("\n");//换行
	}
}

void printB()//输出删除能量线后的数据
{
    int i,j;
    for(i=0;i<M;i++)
    {
        printf("   第%d行:",i+1);
        for(j=0;j<N;j++)
        {
        printf("%10d",A[i][j]);
        }
    printf("\n");
    }
}

void f3()//图像缩小功能提醒
{
    printf("                                                   操作功能\n");
    printf("                    *****************************************************************************\n");
    printf("                          1.使用说明 2.从文件中读取数据 3.用户自行输入数据 4.能量线的逐条删除\n");
    printf("                        5.能量线的一次性删除 6.被删除能量线值的查找 7.屏幕的清空 8结束图像缩小操作\n");
    printf("                    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

void f4()//图像放大功能提醒
{
    printf("                                                   操作功能\n");
    printf("                    *****************************************************************************\n");
    printf("                          1.使用说明 2.从文件中读取数据 3.用户自行输入数据 4.能量线的逐条增加\n");
    printf("                                    5.图像的一次性放大  6.屏幕的清空 7.结束图像放大操作\n");
    printf("                    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

void f()//主界面设置
{
    printf("=======================================================================================================================\n");
    printf("                    -    *************************           **     **                          -\n");
    printf("                    -    *************************          **     **                           -\n");
    printf("                    -    **       **            **         ***    ***********                   -\n");
    printf("                    -    **      ***            **        ****   *************                  -\n");
    printf("                    -    **     ************    **     * ** **  **         **                   -\n");
    printf("                    -    **    *************    **     ***  ** **    ***********                -\n");
    printf("                    -    **   **         **     **          ** *   ***************              -\n");
    printf("                    -    **  *****     **       **          **     **     **    **              -\n");
    printf("                    -    **  **  **** **        **          **     **************  *      *     -\n");
    printf("                    -    **      ******         **          **        ** **      **      **     -\n");
    printf("                    -    **     **    ****      **          **      **   *****   **     **      -\n");
    printf("                    -    **   **  **     ***    **          **     **   **  *************       -\n");
    printf("                    -    **  ** *   **     ***  **          **         **       ******          -\n");
    printf("                    -    ** ** **    **      ** **          **        **       **   ****        -\n");
    printf("                    -    ** *   **    *      *  **          **               **    **           -\n");
    printf("                    -    **       *             **          **             **     **            -\n");
    printf("                    -    *************************          **                   **             -\n");
    printf("                    -    *************************          **               ****               -\n");
    printf("                    -          **                                                               -\n");
    printf("                    -         ** **********                                                     -\n");
    printf("                    -        ** ************   **           *******    *******************      -\n");
    printf("                    -       *****          **  **           *******    *******************      -\n");
    printf("                    -   ** ** ***           ** **              **      **      **       **      -\n");
    printf("                    -    ***   ***          ** **              **      *******************      -\n");
    printf("                    -           ***        **  **              **      *******************      -\n");
    printf("                    -            ***      **   **              **      **      **       **      -\n");
    printf("                    -              **   **     **              **      *******************      -\n");
    printf("                    -               *****      **           *******    *******************      -\n");
    printf("                    -               ** **      ***          *******            **               -\n");
    printf("                    -              **   **     ****            **              **               -\n");
    printf("                    -             **     **    ** **           **      *******************      -\n");
    printf("                    -            **       **   **              ** **   *******************      -\n");
    printf("                    -           **         **  **              ****            **               -\n");
    printf("                    -          **           *****             ****             **               -\n");
    printf("                    -      ** **              *** *          ***       *******************      -\n");
    printf("                    -      ****                ****         **         *******************      -\n");
    printf("======================================================================================================================\n");
    printf("\n");
    printf("                    *****************************************************************************\n");
    printf("\n");
    printf("                                              图像放大和缩小处理欢迎你!\n");
    printf("                                                请选择你的操作\n");
    printf("                    *****************************************************************************\n");
    printf("                                                 1.进入图像缩小界面\n");
    printf("                                                 2.进入图像放大界面\n");
    printf("                                                 3.结束操作\n");
    printf("                    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

void f1()//图像缩小界面设计
{
    printf("                    *****************************************************************************\n");
    printf("\n");
    printf("                                              图像缩小处理欢迎你!\n");
    printf("                                                请选择你的操作\n");
    printf("\n");
    printf("                    *****************************************************************************\n");
    printf("                                              1.使用说明\n");
    printf("                                              2.从文件中读取数据\n");
    printf("                                              3.用户自行输入数据\n");
    printf("                                              4.能量线的逐条删除\n");
    printf("                                              5.能量线的一次性删除\n");
    printf("                                              6.被删除能量线值的查找\n");
    printf("                                              7.屏幕的清空\n");
    printf("                                              8.结束图像缩小操作\n");
    printf("                    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

void f2()//图像放大界面设计
{
    printf("                    *****************************************************************************\n");
    printf("\n");
    printf("                                              图像放大处理欢迎你!\n");
    printf("                                                请选择你的操作\n");
    printf("\n");
    printf("                    *****************************************************************************\n");
    printf("                                              1.使用说明\n");
    printf("                                              2.从文件中读取数据\n");
    printf("                                              3.用户自行输入数据\n");
    printf("                                              4.能量线的逐条增加\n");
    printf("                                              5.图像一次性放大\n");
    printf("                                              6.屏幕的清空\n");
    printf("                                              7.结束图像放大操作\n");
    printf("                    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

int main()
{
    f();//主界面
    int k1=-1;
    while(k1!=3)
    {
      if(k1!=-1)
        f();//主界面
    printf("请选择1或2或3:\n");
    scanf("%d",&k1);
    switch(k1)
    {
    case 1://图像缩小操作模块
     {
          system("cls");//清屏
          f1();//界面设置
          int t=-1;
        while(t!=8)//当t=8时，结束操作
         {
         if(t!=-1)
            f3();//功能提醒
          printf("请选择(1-8)：\n");
          scanf("%d",&t);
          switch(t)
          {
          case 1:
              {
              head1=NULL;
              head2=NULL;
              char s[20][100];//存放说明的汉字
              int i=0;
              FILE *fp;
              printf("使用说明:\n");
              if((fp=fopen("shuoming1.txt","r"))==NULL)//打开文件shuoming
                  {
                         printf("打开文件失败\n");
                        exit(0);
                 }

              while((fgets(s[i],100,fp))!=NULL)//将文件中的字符输出到字符数组中
                  {
                         printf("%s",s[i]);//输出字符
                         i++;
                  }
                    fclose(fp);
                  printf("\n");
              }
              break;
          case 2:
              {
               M=9;
               N=9;//原始图像大小
               M1=9;
               N1=9;
               a=3;
               b=3;//目标图像大小
              FILE *p;
              head1=NULL;
              head2=NULL;
              t1=0;
              t2=0;//每重新输入数据，变量都要初始化
             p=fopen("data1.txt","r");//打开文件data，读取数据
           if(p==NULL)
            {
                printf("打开文件失败！\n");
                return 0;
            }
            for(int i=0;i<9;i++)
              {
                for(int j=0;j<9;j++)
               {
                  fscanf(p,"%d",&A[i][j]);//将数据输出到数组A中
               }
              }
               fclose(p);
               printf("读取数据成功\n");
               printf("                                 原始图像大小为9x9 目标图像大小为3x3\n");
               printf("原始图像\n");
               printB();//输出原始图像
              }
            break;
          case 3:
              {
              printf("请输入原始图像的大小（数据之间用空格隔开）:\n");
               scanf("%d%d",&M,&N);
              M1=M;
              N1=N;
              head1=NULL;
              head2=NULL;
              t1=0;
              t2=0;//每重新输入数据，变量都要初始化
              if(M>0&&N>0)
                  printf("输入成功\n");
                 else
                  printf("输入失败\n");
              printf("请输入原始图像的像素(注意：像素值在0-255内，数据与数据之间用空格或回车键隔开):\n");
                int i,j,k=1;
                  for(i=0;i<M;i++)
                     {
                        for(j=0;j<N;j++)
                         {
                     scanf("%d",&A[i][j]);//输入数据
                         }
                     }

                for(i=0;i<M;i++)
                 {
                     for(j=0;j<N;j++)
                      if(A[i][j]<0||A[i][j]>255)//判别输入值是否符合要求
                     {
                         k=0;
                         break;
                     }
                 }
             if(k==0) printf("输入失败\n");
                     else printf("输入成功\n");
              printf("请输入目标图像的大小（数据之间用空格隔开）:\n");
                    scanf("%d%d",&a,&b);
                if(a>M||b>N||a<1||b<1)
                      printf("输入失败\n");//判别输入值是否符合要求
                   else
                      printf("输入成功\n");
            }
            break;
        case 4:
            {
                int k=0;
                printf("                                    欢迎进行能量线删除操作\n");
                printf("                         1.删除一条竖直能量线 2.删除一条水平能量线\n");
                printf("请选择“1”或“2”:\n");
                scanf("%d",&k);
                if(k!=1&&k!=2)
                    printf("输入错误\n");
                if(k==1)
                {
                   fp1();//找能量线
	               int n=getResult1();
	               printTrace11(n);//标志
	               printf("\n竖直能量线的位置\n");
                   printA2();//输出能量线的位置
                   printf("\n");
                   move1();//移动
                   N--;//删除
                   printf("删除一条能量线后的图像\n");
                   printB();//输出删除后的数据
                }
                else if(k==2)
                {
                   fp2();//找能量线
	               int n=getResult2();
	               printTrace22(n);
	               printf("\n水平能量线的位置\n");
                   printA2();//输出能量线的位置
                   printf("\n");
                   move2();//移动
                   M--;//删除
                   printf("删除一条能量线后的图像\n");
                   printB();//输出删除后的数据
                }
                M1=M;
                N1=N;
            }
            break;
        case 5:
            {
                printf("                                          ##欢迎进行能量线删除操作##\n");
                printf("                                      1.删除竖直能量线 2.删除水平能量线\n");
                printf("请选择“1”或“2“:\n");
                int k=0;
                scanf("%d",&k);
                if(k!=1&&k!=2)
                    printf("输入错误\n");
            if(k==1)
             {
              int i,s;
             if(N<=b) printf("输入错误\n");
              else printf("$$删除竖直能量线$$\n");
             for(i=N;i>b;i--)//计算删除的条数
              {
                printf("\n");
              t1++;//记录第几条
              fp1();//找能量线
              printf("第%d条竖直能量线的位置\n",t1);
	          int scol1=getResult1();
              s=3*t1*M;//s为第t1+1条能量线的第一个数据坐标
	          printTrace1(scol1,s);//将数据放入数组D中，标志
              printA1(t1);//输出能量线的位置
              move1();//移动
              N--;//删除
              printf("删除第%d条竖直能量线后的图像\n",t1);
              printB();//输出删除后的数据
              }
             h1=1;
             h3=1;
             head1=creat(t1*M);//将数据放入链表head1中，j*M为总长度
             }
            else if(k==2)
             {
               int i,s;
            if(M<=a) printf("输入错误\n");
              else printf("$$删除水平能量线$$\n");
            for(i=M;i>a;i--)//计算删除的条数
	          {
               printf("\n");
              t2++;//第几条
	          fp2();//找能量线
	          printf("第%d条水平能量线的位置\n",t2);
	          int scol2=getResult2();
              s=3*t2*N;//s为第j+1条能量线的第一个数据坐标
	          printTrace2(scol2,s);//将数据放入数组D中，标志
	          printA1(t2);//输出能量线的位置
	          move2();//移动
	          M--;//删除
	          printf("删除第%d条水平能量线后的图像\n",t2);
	          printB();//输出删除后的数据
	          }
	          h2=1;
              h3=2;

              head2=creat(t2*N);//将数据放入链表head2中，j*N为总长度
             }

            }
            break;
        case 6:
            {
              int c=-1;
              printf("                                    #￥欢迎进行被删除能量线值的查找操作￥#\n");
              printf("                           1.竖直能量线的值   2.水平能量线的值   3.结束能量线值的查找\n");
              printf("请输入查找的能量线:\n");
              if(h1==1&&h2==1&&h3==1)
                   M1=M;//表示先删除水平能量线，再删除竖直能量线，M值改变，导致竖直能量线的长度改变
              else if(h1==1&&h2==1&&h3==2)
                   N1=N;//表示先删除竖直能量线，再删除水平能量线，N值改变，导致水平能量线的长度改变
              while(c!=3)//当c=3时，结束查找
              {
              printf("请选择(1-3)：\n");
              scanf("%d",&c);
              switch(c)
              {
              case 1:
                  {
                int i;
                printf("请输入查找第几条竖直能量线：\n");
                  scanf("%d",&i);
                if(head1==NULL||t1<i)
                    printf("输入错误\n");
                else
                    print1(i,M1);//查找第i条的数据
                }
            break;
            case 2:
                  {
            int i;
            printf("请输入查找第几条水平能量线：\n");
                scanf("%d",&i);
            if(head2==NULL||t2<i)
                printf("输入错误\n");
            else
                print2(i,N1);//查找第i条的数据
                  }
             break;
                }
            if(c>3||c<1)
                printf("输入错误\n");
            if(c==3)
                printf("能量线查找结束\n");
               }

             }
             break;
            case 7:
             {
             system("cls");
             f1();
             }
             break;
          }
         if(t<1||t>8)
             printf("输入错误\n");
        }
       }
      break;


         case 2://图像放大模块
            {
            system("cls");
            f2();//界面设置
          int t=-1;
        while(t!=7)//当t=7时，结束操作
         {
         if(t!=-1)
            f4();//功能提醒
          printf("请选择(1-7)：\n");
          scanf("%d",&t);
          switch(t)
          {
          case 1:
              {
              char s[20][100];//存放说明的汉字
              int i=0;
              FILE *fp;
              printf("使用说明:\n");
              if((fp=fopen("shouming2.txt","r"))==NULL)//打开文件shuoming2
                  {
                         printf("打开文件失败\n");
                        exit(0);
                  }

              while((fgets(s[i],100,fp))!=NULL)//将文件中的字符输出到字符数组中
                  {
                         printf("%s",s[i]);//输出字符
                         i++;
                  }
                    fclose(fp);
                  printf("\n");
              }
              break;
          case 2:
              {
               M=6;
               N=6;//原始图像大小
               a=9;
               b=9;//目标图像大小
               t1=0;
               t2=0;
              FILE *p;
             p=fopen("data2.txt","r");//打开文件data，读取数据
           if(p==NULL)
            {
                printf("打开文件失败！\n");
                return 0;
            }
            for(int i=0;i<6;i++)
              {
                for(int j=0;j<6;j++)
               {
                  fscanf(p,"%d",&A[i][j]);//将数据输出到数组A中
               }
              }
               fclose(p);
               printf("读取数据成功\n");
               printf("                                 原始图像大小为6X6 目标图像大小为9X9\n");
               printf("原始图像\n");
               printB();//输出原始图像
              }
            break;
          case 3:
              {
              printf("请输入原始图像的大小（数据之间用空格隔开）:\n");
               scanf("%d%d",&M,&N);
              M1=M;
              N1=N;
              t1=0;t2=0;
              if(M>0&&N>0)
                  printf("输入成功\n");
                 else
                  printf("输入失败\n");
              printf("请输入原始图像的像素(注意：像素值在0-255内，数据与数据之间用空格或回车键隔开):\n");
                int i,j,k=1;
                  for(i=0;i<M;i++)
                     {
                        for(j=0;j<N;j++)
                         {
                     scanf("%d",&A[i][j]);//输入数据
                         }
                     }

                for(i=0;i<M;i++)
                 {
                     for(j=0;j<N;j++)
                      if(A[i][j]<0||A[i][j]>255)//判别输入值是否符合要求
                     {
                         k=0;
                         break;
                     }
                 }
             if(k==0) printf("输入失败\n");
                     else printf("输入成功\n");
              printf("请输入目标图像的大小（数据之间用空格隔开）:\n");
                    scanf("%d%d",&a,&b);
                if(a<M||b<N||a<1||b<1)
                      printf("输入失败\n");//判别输入值是否符合要求
                   else
                      printf("输入成功\n");
            }
            break;
        case 4:
            {
                int k=0;
                printf("                                    欢迎进行能量线增加操作\n");
                printf("                         1.增加一条竖直能量线 2.增加一条水平能量线\n");
                printf("请选择“1”或“2”:\n");
                scanf("%d",&k);
                if(k!=1&&k!=2)
                    printf("输入错误\n");
                if(k==1)
                {
                   fp1();//找能量线
	               int n=getResult1();
	               printTrace11(n);//标志
	               printf("\n竖直能量线的位置\n");
                   printA2();//输出能量线的位置
                   printf("\n");
                   move11();//移动
                   N++;//增加
                   printf("增加一条能量线后的图像\n");
                   printB();//输出增加后的数据
                }
                else if(k==2)
                {
                   fp2();//找能量线
	               int n=getResult2();
	               printTrace22(n);
	               printf("\n水平能量线的位置\n");
                   printA2();//输出能量线的位置
                   printf("\n");
                   move22();//移动
                   M++;//增加
                   printf("增加一条能量线后的图像\n");
                   printB();//输出增加后的数据
                }
            }
            break;
        case 5:
            {
                printf("                                            ##欢迎进行图像放大操作##\n");
                printf("                                          1.水平放大图像 2.竖直放大图像\n");
                printf("请选择“1”或“2“:\n");
                int k=0;
                scanf("%d",&k);
                if(k!=1&&k!=2)
                    printf("输入错误\n");
            if(k==1)
             {
              int i;
             if(N>=b) printf("输入错误\n");
              else printf("$$水平放大图像$$\n");
             for(i=N;i<b;i++)//计算增加的条数
              {
                printf("\n");
              t1++;//记录第几条
              fp1();//找能量线
              printf("第%d条竖直能量线的位置\n",t1);
	          int scol1=getResult1();
	          printTrace11(scol1);//标志
              printA1(t1);//输出能量线的位置
              move11();//移动
              N++;//增加
              printf("增加第%d条竖直能量线后的图像\n",t1);
              printB();//输出增加后的数据
               }
             }
            else if(k==2)
             {
               int i;
            if(M>=a) printf("输入错误\n");
              else printf("$$竖直放大图像$$\n");
            for(i=M;i<a;i++)//计算增加的条数
	          {
               printf("\n");
              t2++;//第几条
	          fp2();//找能量线
	          printf("第%d条水平能量线的位置\n",t2);
	          int scol2=getResult2();
	          printTrace22(scol2);//标志
	          printA1(t2);//输出能量线的位置
	          move22();//增加
	          M++;//增加
	          printf("增加第%d条水平能量线后的图像\n",t2);
	          printB();//输出增加后的数据
	          }
             }
            }
            break;
        case 6:
            {
             system("cls");
             f2();
            }
            break;
          }
          if(t<1||t>7)
            printf("输入错误\n");
        }
      }
      break;
    }
   }
   system("cls");
   printf("                                       $$感谢你的使用$$\n");
  return 0;
}

